💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    22 요청 이용하기 | ✅ 저자: 이유정(박사)

    Request란? Request는 클라이언트(브라우저, React 앱 등)가 FastAPI 서버에 요청을 보낼 때 전달되는 모든 정보를 담고 있는 객체입니다.

    쉽게 말해: "누가 언제 어떤 내용으로 요청했는지 다 담겨있는 편지 봉투"

    왜 필요한가? FastAPI는 기본적으로 GET, POST 등의 요청을 받아서 응답을 해줘요. 하지만, 어떤 요청인지, 누구한테서 왔는지, 어떤 값을 보냈는지 세부 정보가 필요할 때가 많습니다.

    예를 들어:

    • 로그인한 사용자의 IP가 궁금할 때
    • 요청 헤더나 쿠키로 인증 정보를 받고 싶을 때
    • 요청 본문(body)에 파일이나 JSON 데이터가 있는지 확인할 때
    • URL에 쿼리스트링이 붙었는지 확인할 때
    Request에서 어떤 정보들을 꺼낼 수 있나?
    항목 예시 설명
    request.method "GET", "POST" 어떤 HTTP 방식인지
    request.url http://127.0.0.1/items/3 전체 URL 주소
    request.headers User-Agent, Authorization 요청 헤더 정보
    request.cookies 로그인 쿠키 등 쿠키 정보
    request.query_params ?name=abc&age=3 URL의 쿼리 파라미터
    request.path_params items/{item_id}{item_id}
    request.body() JSON 등 POST로 보내는 본문 데이터
    request.form() 폼 데이터를 받을 때
    request.client 요청한 사람의 IP 주소 등
    request.app 현재 실행 중인 FastAPI 앱

    언제 사용하는가?

    • API 디버깅할 때 (요청을 모두 기록하는 로그용)
    • 사용자 인증 정보 확인
    • 웹 클라이언트가 어떤 기기인지 판단할 때 (User-Agent)
    • 쿠키 기반 로그인 처리
    • 성능 측정용 (미들웨어로 요청 처리 시간 측정)

    요청 URL 확인

    # request_info.py
    from fastapi import FastAPI, Request
    
    app = FastAPI()
    
    @app.get("/request-info")
    async def get_request_info(request: Request):
        return {
            "method": request.method, # 요청 방식: GET, POST 등
            "url": str(request.url),  # 전체 요청 URL
            "client_host": request.client.host,# 클라이언트 IP 주소
            "headers": dict(request.headers),# 전체 요청 헤더
            "query_params": dict(request.query_params),  
            # 쿼리 파라미터 (?key=value)
            
            "cookies": request.cookies,  # 쿠키 정보
            "path_params": request.path_params, # 경로매개변수(/{id} 등)
            "app_name": str(request.app.title),# 현재 FastAPI 앱 이름
        }
    

    실행:

    uvicorn request_info:app --reload
    

    요청 결과:

    {
      "method": "GET",
      "url": "http://localhost:8000/request-info?name=banana&price=3000",
      "client_host": "127.0.0.1",
      "headers": {
        "host": "localhost:8000",
        "user-agent": "Mozilla/5.0 ...",
        "accept": "*/*",
        ...
      },
      "query_params": {
        "name": "banana",
        "price": "3000"
      },
      "cookies": {},
      "path_params": {},
      "app_name": "FastAPI"
    }
    
    • request.method: 어떤 방식으로 요청했는지 (GET, POST 등)
    • request.url: 전체 URL을 문자열로 출력
    • request.client.host: 요청한 사람의 IP 주소
    • request.headers: 요청할 때 같이 보낸 헤더들
    • request.query_params: URL에 ?key=value로 붙은 정보
    • request.cookies: 쿠키를 사용하는 경우
    • request.path_params: URL에 포함된 변수들 (/items/{id} 같은 경우)
    • request.app.title: FastAPI 앱의 이름 (FastAPI() 기본값은 "FastAPI")

    Request 정보와 Header 정보는 서로 포함 관계에 있고, 목적과 범위가 다릅니다. 요청(Request)은 클라이언트(브라우저, 앱, Postman, React 등)가 서버(FastAPI, Django 등)에게 "무언가를 해달라"고 보내는 메시지입니다.

    헤더는 클라이언트와 서버가 요청이나 응답을 주고받을 때 같이 보내는 '부가 정보'입니다.


    1. 요청(Request Header) — 클라이언트 → 서버 클라이언트(브라우저, 앱 등)가 서버로 요청을 보낼 때, 이 요청에 헤더 정보를 담습니다. 예시:
    GET /items/123 HTTP/1.1
    Host: localhost:8000
    User-Agent: Chrome/119.0
    Accept: application/json
    Authorization: Bearer abc.def.ghi
    

    해석:

    • Host: 어디로 요청을 보낼 건지
    • User-Agent: 누가 보냈는지 (브라우저 정보)
    • Accept: 나는 어떤 형식(JSON 등)을 받고 싶어
    • Authorization: 로그인 토큰 (인증 정보)

    → 이런 요청 헤더 정보는 FastAPI에서 request.headers로 확인 가능


    1. 응답(Response Header) — 서버 → 클라이언트 서버가 클라이언트에게 결과를 보낼 때, 응답 데이터뿐 아니라 헤더 정보도 함께 전달합니다. 예시
    HTTP/1.1 200 OK
    Content-Type: application/json
    X-Process-Time: 0.0041
    Cache-Control: no-store
    

    이건 FastAPI의 미들웨어나 응답 설정에서 response.headers["..."]로 설정 가능

    비유로 이해하기

    • 전체 Request = 손님이 식당에 온 상황 전체

      • 누가 왔는지(IP), 어떤 요리 주문했는지(URL, body), 어떤 조건으로 왔는지(헤더), 무슨 요구사항이 있는지(query) 등
    • Header = 손님이 들고 온 명함이나 요청사항 쪽지

      • "나는 Chrome 브라우저를 써요", "토큰은 이거에요", "나는 JSON 응답을 원해요", "비밀번호는 쿠키에 있어요" 같은 요청 설정 정보
    TOP
    preload preload